<?php
/**
 * 抽象工厂模式
 *
 * 提供一个接口，让该接口负责创建一系列“相关或者相互依赖的对象”，无需指定他们的具体类。
 *
 *
 * 优点：减少代码修改量。缺点:难以应对新类型的对象（如除了轮子，油箱以外的对象）创建。
 */


//轮子抽象类
abstract class AbstractWheel
{
	public function __construct()
	{
		//echo "create a AbstractWheel";
	}	
}
//油箱抽象类
abstract class AbstractOilBox
{
	public function __construct()
	{
		//echo "create a AbstractWheel";
	}
}
//工厂抽象类
abstract class AbstractFactory
{
	//返回一个轮子对象
	abstract public function createWheel();
	//返回一个油箱对象
	abstract public function createOilBox();
}




//实现这些类
class BwnWheel extends AbstractWheel{
	public function __construct(){
		echo "create a BwnWheel\n";
	}
}
class BwnOilBox extends AbstractOilBox{
	public function __construct(){
		echo "create a BwnOilBox\n";
	}
}
class BwnFactory extends AbstractFactory
{
	public function createWheel(){
		return new BwnWheel();
	}
	public function createOilBox(){
		return new BwnOilBox();
	} 
}

//创建一个Bwn工厂(当更换工厂时，只需要将这个工厂类替换即可)
$Factory = new BwnFactory();
//创建一个轮子
$Factory->createWheel();
//创建一个油箱
$Factory->createOilBox();



